"""
476. 数字的补数
简单
相关标签
premium lock icon
相关企业
对整数的二进制表示取反（0 变 1 ，1 变 0）后，再转换为十进制表示，可以得到这个整数的补数。

例如，整数 5 的二进制表示是 "101" ，取反后得到 "010" ，再转回十进制表示得到补数 2 。
给你一个整数 num ，输出它的补数。



示例 1：

输入：num = 5
输出：2
解释：5 的二进制表示为 101（没有前导零位），其补数为 010。所以你需要输出 2 。
示例 2：

输入：num = 1
输出：0
解释：1 的二进制表示为 1（没有前导零位），其补数为 0。所以你需要输出 0 。


提示：

1 <= num < 231


注意：本题与 1009 https://leetcode-cn.com/problems/complement-of-base-10-integer/ 相同
"""


class Solution:
    def findComplement(self, num: int) -> int:
        # 计算数字的二进制位数
        if num == 0:
            bit_length = 1
        else:
            bit_length = num.bit_length()

        # 创建相同长度的全1数字
        all_ones = (1 << bit_length) - 1
        return num^all_ones
if __name__ == '__main__':
    print(Solution().findComplement(5))
    print(Solution().findComplement(1))
    print(int(0).bit_count())
    print( (1 << int(0).bit_count()) - 1)